package org2.jogo.models;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SetPerguntas {

    public static final int DIFICULDADE_FACIL = 1;
    public static final int DIFICULDADE_MEDIO = 2;
    public static final int DIFICULDADE_DIFICIL = 3;

    // O tamanho define o número de perguntas total
    private Pergunta[] perguntas;
    // Número de perguntas adicionadas
    private int nPerguntas;
    // Próxima pergunta a ser respondida pelo jogador
    private int perguntaAtual;
    private int dificuldade;
    private String nomeJogador;

    public SetPerguntas(int tamanhoJogo, int dificuldade, String nome) {
        this.perguntas = new Pergunta[tamanhoJogo];
        this.perguntaAtual = 0;
        this.dificuldade = dificuldade;
        nomeJogador = nome;
    }

    public boolean addPergunta(Pergunta pergunta) {
        if (nPerguntas < perguntas.length) {
            perguntas[nPerguntas++] = pergunta;
            return true;
        }
        return false;
    }

    public int numeroPerguntas() {
        return perguntas.length;
    }

    public void respondeProximaPergunta(int alternativaMarcada, float tempoResposta) {
        perguntas[perguntaAtual++].setResposta(alternativaMarcada, tempoResposta);
    }

    public Pergunta getProximaPergunta() {
        return perguntas[perguntaAtual];
    }

    public boolean temMaisPerguntas() {
        return ((perguntaAtual + 1) < perguntas.length);
    }

    public boolean jogoTerminou() {
        return perguntas[perguntas.length - 1].jaFoiMarcada();
    }

    public int getDificuldade() {
        return dificuldade;
    }

    public String getNomeJogador() {
        return nomeJogador;
    }

    public int getNumeroAcertos() {
        int acertos = 0;
        for (Pergunta pergunta : perguntas) {
            acertos += pergunta.acertada() ? 1 : 0;
        }
        return acertos;
    }

    /**
     * Tempo limite para o jogador responder a pergunta.
     * 
     * @return Retorna o tempo, em segundos.
     */
    public int getTempoLimite() {
        switch (dificuldade) {
        case DIFICULDADE_FACIL:
            return 80;
        case DIFICULDADE_MEDIO:
            return 40;
        case DIFICULDADE_DIFICIL:
            return 20;
        default:
            return 40;
        }
    }

    public int getTempoTolerancia() {
        return getTempoLimite() / 2;
    }

    /**
     * Calcula a pontuação do jogador.
     * 
     * @return Retorna a pontuação calculada de todas as perguntas
     */
    public int getPontuacaoTotal() {
        float pontuacao = 0;
        // Soma a pontuação de todas as perguntas
        for (Pergunta pergunta : perguntas) {
            // Calcula a pontuação de cada pergunta, passando o multiplicador de
            // dificuldade, que pode ser 1, 2 ou 4
            int multiplicador = dificuldade == DIFICULDADE_DIFICIL ? 4 : dificuldade;
            pontuacao += pergunta.getPontuacao(getTempoLimite(), getTempoTolerancia(), multiplicador);
        }
        // Equilibra a pontuação para todos os jogos ficarem entre 0 e 100
        // pontos
        pontuacao = (int)((10.0 / numeroPerguntas()) * pontuacao);
        // Retorna a pontuação sem casas decimais
        return Math.round(pontuacao);
    }

    public Pontuacao getPontuacaoDecorada() {
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yy - HH:mm:ss");
        return new Pontuacao(nomeJogador, getPontuacaoTotal(), dificuldade, formato.format(new Date()));
    }

}
